home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Aminet
/
util
/
cli
/
fdb2.lha
/
FDB2
/
FDB2.mod
< prev
next >
Wrap
Text File
|
1995-04-20
|
10KB
|
415 lines
MODULE FDB2;
(*
FDB2 by Carsten Orthbandt
Version 1.3 20/04/95
The better FindDB.
This is free software und the GNU License.
See the file COPYING for copying permission.
*)
IMPORT
d:Dos,
Arguments,
y:SYSTEM,
fs:FileSystem,
u:Utility,
str:Strings,
Break,
io;
CONST
template=
"P=PATTERN/A,DBD=DBASEDIR/K,MPATH/K,E=EXACT/S,CS=CASESENSITIVE/S,"
"D=DIRS/S,F=FILES/S,O=ONCE/S,ALLDBS/S,NH=NOHEAD/S,"
"NP=NOPATH/S,PG=PAGES/S,NOINFO/S,SETENV/S,DB=DATABASE/K"
"\o$VER: FDB2 1.3 by HDS 20/04/95\o";
VersionComment=
"\nFDB2 1.3 by HDS\n"
"The better FindDB.\nThis is Freeware under GNU License. See docs for details.\n\n";
HelpText=
"\nP=PATTERN/A : Dos pattern to search for.\n"
"DBD=DBASEDIR/K : Dir to search for databases. Default is DEVS:.\n"
"MPATH/K : Ignore entry if this path doesn´t match.\n"
"E=EXACT/S : Show only exact matches of pattern.\n"
"CS=CASESENSITIVE/S: Search case sensitive.\n"
"D=DIRS/S : Show only dirs.\n"
"F=FILES/S : Show only files.\n"
"O=ONCE/S : Show only first match.\n"
"ALLDBS/S : Scan all databases in database dir. Overrides DATABASE.\n"
"NH=NOHEAD/S : Don´t show header.\n"
"NP=NOPATH/S : Don´t show paths.\n"
"PG=PAGES/S : Not used. Compatibility only.\n"
"NOINFO/S : Ignore .info files.\n"
"SETENV/S : Store this command line as default in ENV:FDB2.prefs.\n"
"DB=DATABASE/K : FDB Database to use. Default is find.codes.\n"
"Enter arguments";
TYPE
strg=ARRAY 300 OF CHAR;
Args = STRUCT (as :d.ArgsStruct);
pttrn :d.ArgString;
dbdir :d.ArgString;
mpath :d.ArgString;
exact :d.ArgBool;
cases :d.ArgBool;
dirs :d.ArgBool;
files :d.ArgBool;
once :d.ArgBool;
alldb :d.ArgBool;
nohead :d.ArgBool;
nopath :d.ArgBool;
pages :d.ArgBool;
noinfo :d.ArgBool;
setenv :d.ArgBool;
dbase :d.ArgString;
END;
TYPE
dbsPtr=POINTER TO dbs;
dbs =STRUCT
next:dbsPtr;
name:strg;
END;
TYPE
EntryPtr=POINTER TO Entry;
Entry = STRUCT
next:EntryPtr;
name:strg;
END;
VAR
tmps,rpatt,mpath,mpatt,patt,dbase,olin,line,dir,search,dbdir:strg;
fi:fs.File;
i,j,start: LONGINT;
nm,nma,len,len2:LONGINT;
noinfo,alldb,setenv,nohead,nopath,files,dirs,case,exct,once,done:BOOLEAN;
dbases:dbsPtr;
dummy:BOOLEAN;
ed,ef,ad,af,bd,bf:EntryPtr;
PROCEDURE Scan(Name:ARRAY OF CHAR);
VAR Fi:d.FileInfoBlockPtr;
Cd:d.FileLockPtr;
S:ARRAY 256 OF CHAR;
S1,S2,S3:BOOLEAN;
ndbs:dbsPtr;
BEGIN;
NEW(Fi);
Cd:=d.Lock(Name,d.sharedLock);
S1:=d.Examine(Cd,Fi^);
IF S1 THEN
REPEAT;
S2:=d.ExNext(Cd,Fi^);
IF S2 THEN
IF (Fi.dirEntryType<0) THEN
IF str.Occurs(Fi.fileName,".codes")#-1 THEN
NEW(ndbs);
ndbs.next:=dbases;
COPY(Fi.fileName,ndbs.name);
dbases:=ndbs;
END;
END;
END;
UNTIL ~S2;
END;
d.UnLock(Cd);
DISPOSE(Fi);
END Scan;
PROCEDURE ReadArgs;
VAR
cmargs:d.RDArgsPtr;
cmargv:Args;
envar:d.RDArgsPtr;
PROCEDURE ParseArgs;
BEGIN;
COPY(cmargv.pttrn^,patt);
IF cmargv.dbase#NIL THEN COPY(cmargv.dbase^,dbase);END;
IF cmargv.dbdir#NIL THEN COPY(cmargv.dbdir^,dbdir);END;
IF cmargv.mpath#NIL THEN COPY(cmargv.mpath^,mpath);END;
exct:=(cmargv.exact)#0;
case:=(cmargv.cases)#0;
once:=(cmargv.once)#0;
alldb:=(cmargv.alldb)#0;
dirs:=(cmargv.dirs)#0;
files:=(cmargv.files)#0;
nohead:=(cmargv.nohead)#0;
nopath:=(cmargv.nopath)#0;
noinfo:=(cmargv.noinfo)#0;
setenv:=(cmargv.setenv)#0;
END ParseArgs;
PROCEDURE MakeEnvString;
VAR st1:strg;
n:INTEGER;
m:LONGINT;
fl:fs.File;
BEGIN;
IF fs.Open(fl,"ENV:FDB2.prefs",TRUE) THEN
FOR n:=1 TO Arguments.NumArgs() DO
Arguments.GetArg(n,st1);
FOR m:=0 TO str.Length(st1)-1 DO
IF fs.WriteChar(fl,st1[m]) THEN END;
END;
IF fs.WriteChar(fl," ") THEN END;
END;
IF fs.WriteChar(fl,"\n") THEN END;
IF fs.Close(fl) THEN END;
END;
END MakeEnvString;
PROCEDURE Defaults;
BEGIN;
cmargv.dbase:=y.ADR("find");
cmargv.dbdir:=y.ADR("DEVS:");
cmargv.mpath:=y.ADR("#?");
cmargv.dirs:=0;
cmargv.files:=0;
cmargv.cases:=0;
cmargv.exact:=0;
cmargv.once:=0;
cmargv.alldb:=0;
cmargv.nohead:=0;
cmargv.nopath:=0;
cmargv.pages:=0;
cmargv.noinfo:=0;
cmargv.setenv:=0;
END Defaults;
PROCEDURE UpdateDefaults;
BEGIN;
cmargv.dbase:=y.ADR(dbase);
cmargv.dbdir:=y.ADR(dbdir);
cmargv.mpath:=y.ADR(mpath);
IF dirs THEN cmargv.dirs:=1;END;
IF files THEN cmargv.files:=1;END;
IF case THEN cmargv.cases:=1;END;
IF exct THEN cmargv.exact:=1;END;
IF once THEN cmargv.once:=1;END;
IF alldb THEN cmargv.alldb:=1;END;
IF nohead THEN cmargv.nohead:=1;END;
IF nopath THEN cmargv.nopath:=1;END;
IF noinfo THEN cmargv.noinfo:=1;END;
cmargv.setenv:=0;
END UpdateDefaults;
PROCEDURE ReadPrefs;
VAR fl:fs.File;
st1,st2,st3:strg;
n:LONGINT;
BEGIN;
IF fs.Open(fl,"ENV:FDB2.prefs",FALSE) THEN
IF fs.ReadString(fl,st1) THEN
st1[str.Length(st1)]:="\n";
envar:=d.AllocDosObjectTags(d.rdArgs,u.done);
envar.extHelp:=y.ADR(HelpText);
envar.source.buffer:=y.ADR(st1);
envar.source.length:=str.Length(st1);
envar.source.curChr:=0;
cmargs := d.ReadArgs(template, cmargv, envar);
IF cmargs=NIL THEN
IF d.PrintFault(d.IoErr(),"FDB2 Invalid Prefs") THEN END;
ELSE
ParseArgs;
UpdateDefaults;
d.FreeArgs(cmargs);
END;
d.FreeDosObject(d.rdArgs,envar);
END;
IF fs.Close(fl) THEN END;
END;
END ReadPrefs;
BEGIN;
IF Arguments.NumArgs()>0 THEN
Arguments.GetArg(1,dbase);
IF dbase="?" THEN io.WriteString(VersionComment);END;
END;
Defaults;
ReadPrefs;
setenv:=FALSE;
cmargv.setenv:=0;
envar:=d.AllocDosObjectTags(d.rdArgs,u.done);
envar.extHelp:=y.ADR(HelpText);
cmargs := d.ReadArgs(template, cmargv, envar);
IF cmargs=NIL THEN
IF d.PrintFault(d.IoErr(),"FDB2") THEN END;
HALT(20)
END;
ParseArgs;
d.FreeArgs(cmargs);
d.FreeDosObject(d.rdArgs,envar);
IF setenv THEN MakeEnvString;END;
IF ~dirs AND ~files THEN dirs:=TRUE;files:=TRUE;END;
END ReadArgs;
PROCEDURE GetDBName(db:strg):strg;
VAR ret:strg;
BEGIN;
ret:=dbdir;
IF d.AddPart(ret,db,300) THEN END;
RETURN ret;
END GetDBName;
PROCEDURE AnsiDir;
BEGIN;
io.WriteString("\2331m");
END AnsiDir;
PROCEDURE AnsiHead;
BEGIN
io.WriteString("\2332m");
END AnsiHead;
PROCEDURE AnsiOff;
BEGIN;
io.WriteString("\2330m");
END AnsiOff;
PROCEDURE ShowDate(name:ARRAY OF CHAR);
VAR dt:d.DateTime;
lck:d.FileLockPtr;
fb:d.FileInfoBlockPtr;
outp:ARRAY 30 OF CHAR;
BEGIN;
NEW(fb);
lck:=d.Lock(name,d.sharedLock);
IF lck#NIL THEN
IF d.Examine(lck,fb^) THEN
dt.format:=0;
dt.flags:=SHORTSET{0};
dt.stamp:=fb.date;
dt.strDate:=y.ADR(outp);
dt.strDay:=NIL;
dt.strTime:=NIL;
IF d.DateToStr(dt) THEN io.WriteString(outp);END;
END;
d.UnLock(lck);
END;
DISPOSE(fb);
END ShowDate;
PROCEDURE PrintLists;
BEGIN;
io.WriteString("Dirs:");
ad:=ed;
WHILE ad#NIL DO
io.WriteString(ad.name);io.WriteLn;
bd:=ad;ad:=ad.next;DISPOSE(bd);
END;
io.WriteString("\nFiles:");
af:=ef;
WHILE af#NIL DO
io.WriteString(af.name);io.WriteLn;
bf:=af;af:=af.next;DISPOSE(bf);
END;
END PrintLists;
PROCEDURE FinderNoCase;
BEGIN;
NEW(ed);NEW(ef);
ed.name:="";ef.name:="";
bd:=ed;bf:=ef;
len2:=str.Length(search);
IF fs.Open(fi,GetDBName(dbase),FALSE) THEN
WHILE fs.ReadString(fi,line)AND ~done DO
olin:=line;
IF ~case THEN str.Upper(olin);END;
len:=str.Length(line);
IF line[len-1]="/" THEN
dir:=line;
IF d.MatchPattern(mpatt,dir) THEN
IF d.MatchPattern(search,olin)AND dirs THEN
done:=once;
NEW(ad);ad.name:=dir;bd.next:=ad;bd:=ad;
END;
END;
ELSE
IF d.MatchPattern(mpatt,dir) THEN
IF d.MatchPattern(search,olin)AND files THEN
done:=once;
IF (~noinfo) OR (str.Occurs(line,".info")=-1) THEN
NEW(af);af.name:="";bf.next:=af;bf:=af;
IF ~nopath THEN af.name:=dir;END;
str.Append(af.name,line);
ELSE
done:=FALSE;
END;
END;
END;
END;
END;
IF fs.Close(fi) THEN END;
PrintLists;
ELSE
io.WriteString("Could not open ");io.WriteString(dbase);io.WriteLn;
END;
END FinderNoCase;
PROCEDURE SearchDB;
BEGIN;
done:=FALSE;
i:=str.Length(dbase);
IF str.Occurs(dbase,".codes")=-1 THEN
str.Append(dbase,".codes");
END;
IF ~nohead THEN
io.WriteString(" >> Searching ");io.WriteString(dbase);
io.WriteString(" for ");io.WriteString(patt);io.WriteString(" ( ");
ShowDate(GetDBName(dbase));io.WriteString(")\n");
END;
IF ~case THEN
str.Upper(patt);
END;
IF ~exct THEN
search:=patt;
patt[0]:="#";
patt[1]:="?";
i:=0;
WHILE search[i]#CHR(0) DO
patt[i+2]:=search[i];INC(i);
END;
patt[i+2]:="#";
patt[i+3]:="?";
patt[i+4]:=CHR(0);
END;
IF d.ParsePattern(mpath,mpatt,300)#-1 THEN
IF d.ParsePattern(patt,search,300)#-1 THEN
FinderNoCase;
END;END;
END SearchDB;
PROCEDURE Main;
VAR adb,odb:dbsPtr;
BEGIN;
IF ~alldb THEN
NEW(dbases);
dbases.next:=NIL;
dbases.name:=dbase;
ELSE
Scan(dbdir);
END;
rpatt:=patt;
adb:=dbases;
WHILE adb#NIL DO
dbase:=adb.name;
SearchDB;
patt:=rpatt;
adb:=adb.next;
END;
END Main;
BEGIN;
ReadArgs;
Main;
END FDB2.